﻿using CommonConfig;
using SmartBusinessCardEntity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Text;

namespace SmartBusinessCardWCF.Servers
{
    // 注意: 使用“重构”菜单上的“重命名”命令，可以同时更改代码、svc 和配置文件中的类名“WXServer”。
    // 注意: 为了启动 WCF 测试客户端以测试此服务，请在解决方案资源管理器中选择 WXServer.svc 或 WXServer.svc.cs，然后开始调试。
    // 注意: 使用“重构”菜单上的“重命名”命令，可以同时更改代码和配置文件中的类名“Service”。
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class WXServer : IWXServer
    {
        public void DoWork()
        {

        }

        public string WXPost(string serviceCode, object postObject)
        {
            // 请求参数
            RequestEntity requestEntity = new RequestEntity();
            requestEntity.ServiceCode = serviceCode;
            requestEntity.RequestParam = postObject;

            // 获取配置信息
            ServerEntity serverEntity = new ServerEntity(serviceCode);
            //加载程序集(dll文件地址)，使用Assembly类   
            string dllPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, serverEntity.Assembly + ".dll");
            Assembly assembly = Assembly.LoadFile(dllPath);

            ////获取类型，参数（名称空间+类）   
            Type type = assembly.GetType(serverEntity.NameSpaceClassName);

            ////创建该对象的实例，object类型，参数（名称空间+类）   
            object instance = assembly.CreateInstance(serverEntity.NameSpaceClassName);

            ////设置被调用方法中的参数类型，Type[]类型；如有多个参数可以追加多个   
            Type[] params_type = new Type[1];
            params_type[0] = typeof(RequestEntity);
            ////设置被调用方法中的参数值；如有多个参数可以追加多个   
            Object[] params_obj = new Object[1];
            params_obj[0] = requestEntity;

            ////执行Show_Str方法   
            object value = type.GetMethod(serverEntity.Method, params_type).Invoke(instance, params_obj);

            ResultEntity resultEntity = value as ResultEntity;
            return resultEntity.Json;
        }


    }
}
